home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 March / PCWorld_2007-03_cd.bin / domacnost a kancelar / scribus / scribus-1.3.3.7-win32-install.exe / lib / compiler / misc.py < prev    next >
Text File  |  2001-10-18  |  2KB  |  75 lines

  1. import types
  2.  
  3. def flatten(tup):
  4.     elts = []
  5.     for elt in tup:
  6.         if type(elt) == types.TupleType:
  7.             elts = elts + flatten(elt)
  8.         else:
  9.             elts.append(elt)
  10.     return elts
  11.  
  12. class Set:
  13.     def __init__(self):
  14.         self.elts = {}
  15.     def __len__(self):
  16.         return len(self.elts)
  17.     def __contains__(self, elt):
  18.         return self.elts.has_key(elt)
  19.     def add(self, elt):
  20.         self.elts[elt] = elt
  21.     def elements(self):
  22.         return self.elts.keys()
  23.     def has_elt(self, elt):
  24.         return self.elts.has_key(elt)
  25.     def remove(self, elt):
  26.         del self.elts[elt]
  27.     def copy(self):
  28.         c = Set()
  29.         c.elts.update(self.elts)
  30.         return c
  31.  
  32. class Stack:
  33.     def __init__(self):
  34.         self.stack = []
  35.         self.pop = self.stack.pop
  36.     def __len__(self):
  37.         return len(self.stack)
  38.     def push(self, elt):
  39.         self.stack.append(elt)
  40.     def top(self):
  41.         return self.stack[-1]
  42.     def __getitem__(self, index): # needed by visitContinue()
  43.         return self.stack[index]
  44.  
  45. MANGLE_LEN = 256 # magic constant from compile.c
  46.  
  47. def mangle(name, klass):
  48.     if not name.startswith('__'):
  49.         return name
  50.     if len(name) + 2 >= MANGLE_LEN:
  51.         return name
  52.     if name.endswith('__'):
  53.         return name
  54.     try:
  55.         i = 0
  56.         while klass[i] == '_':
  57.             i = i + 1
  58.     except IndexError:
  59.         return name
  60.     klass = klass[i:]
  61.  
  62.     tlen = len(klass) + len(name)
  63.     if tlen > MANGLE_LEN:
  64.         klass = klass[:MANGLE_LEN-tlen]
  65.  
  66.     return "_%s%s" % (klass, name)
  67.  
  68. def set_filename(filename, tree):
  69.     """Set the filename attribute to filename on every node in tree"""
  70.     worklist = [tree]
  71.     while worklist:
  72.         node = worklist.pop(0)
  73.         node.filename = filename
  74.         worklist.extend(node.getChildNodes())
  75.